package group.program.Service.impl;

import group.program.Service.ReportService;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ReportServiceImpl implements ReportService {
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void getLineChart(HttpServletResponse response, List<BigDecimal> Data, List<Object> Index) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        Map<Object, BigDecimal> indexDataMap = new HashMap<>();

        // 将重复的 Index 数据合并
        for (int i = 0; i < Data.size(); i++) {
            Object index = Index.get(i);
            BigDecimal value = Data.get(i);
            indexDataMap.put(index, value); // 如果重复，后一个值会覆盖前一个值
        }

        // 将合并后的数据添加到数据集中
        for (Map.Entry<Object, BigDecimal> entry : indexDataMap.entrySet()) {
            Object key = entry.getKey(); // 键是 Object 类型
            BigDecimal value = entry.getValue();
            // 将 Object 类型的键转换为字符串
            String keyAsString = key.toString();
            dataset.addValue(value, "Series1", keyAsString);
        }

        // 创建折线图
        JFreeChart chart = ChartFactory.createLineChart(
                "Road Segment Lengths",  // 图表标题
                "Segment",                // X轴标签
                "Length",                 // Y轴标签
                dataset,                  // 数据集
                PlotOrientation.VERTICAL,
                true,                     // 是否显示图例
                true,                     // 是否生成工具提示
                false                     // 是否生成 URL 链接
        );

        // 设置图表背景颜色为白色
        chart.setBackgroundPaint(java.awt.Color.WHITE);

        // 获取图表的绘图区域
        CategoryPlot plot = chart.getCategoryPlot();

        // 设置绘图区域背景颜色为白色
        plot.setBackgroundPaint(java.awt.Color.WHITE);

        // 获取折线渲染器
        LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();

        // 设置折线颜色为黑色
        renderer.setSeriesPaint(0, java.awt.Color.BLACK);

        // 设置折线宽度为加粗
        renderer.setSeriesStroke(0, new BasicStroke(1.0f)); // 更高的线宽

        // 设置响应的内容类型为图像
        response.setContentType("image/png");

        try (OutputStream outputStream = response.getOutputStream()) {
            // 将图像写入响应输出流
            ChartUtils.writeChartAsPNG(outputStream, chart, 800, 600);
        } catch (IOException e) {
            logger.error("Error while exporting chart image.", e);
        }
    }

    @Override
    public void getHistogram(HttpServletResponse response,List<BigDecimal> Data, List<Object> Index) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        // 添加数据到数据集中
        for (int i = 0; i < Data.size(); i++) {
            BigDecimal x = Data.get(i);
            Object y = Index.get(i);
            dataset.addValue(x, x.toString(), y.toString());
        }
        // 创建柱状图
        JFreeChart chart = ChartFactory.createBarChart(
                "Road Segment Lengths",  // 图表标题
                "Segment",                // X轴标签
                "Length",                 // Y轴标签
                dataset,                  // 数据集
                org.jfree.chart.plot.PlotOrientation.VERTICAL,
                true,                     // 是否显示图例
                true,                     // 是否生成工具提示
                false                     // 是否生成 URL 链接
        );
        // 设置图表背景颜色为白色
        chart.setBackgroundPaint(Color.WHITE);
        // 获取图表的绘图区域
        CategoryPlot plot = chart.getCategoryPlot();
        // 设置绘图区域背景颜色为白色
        plot.setBackgroundPaint(Color.WHITE);
        // 获取柱状图渲染器
        BarRenderer renderer = (BarRenderer) plot.getRenderer();
        // 设置柱子的颜色为黑色
        renderer.setSeriesPaint(0, Color.BLACK);
        // 设置柱子之间的间隔
        renderer.setItemMargin(0.1); // 这个值调整柱子之间的间隔
        // 设置响应的内容类型为图像
        response.setContentType("image/png");
        try (OutputStream outputStream = response.getOutputStream()) {
            // 将图像写入响应输出流
            ChartUtils.writeChartAsPNG(outputStream, chart, 800, 600);
        } catch (IOException e) {
            // 处理异常
            e.printStackTrace();
        }
    }

    @Override
    public void getPieChart(HttpServletResponse response,List<BigDecimal> Data, List<Object> Index) {
        // 创建饼图数据集
        DefaultPieDataset dataset = new DefaultPieDataset();
        // 添加数据到饼图数据集中
        for (int i = 0; i < Data.size(); i++) {
            BigDecimal value = Data.get(i);
            String category = Index.get(i).toString(); // 使用索引作为类别
            dataset.setValue(category, value); // 添加到数据集中
        }
        // 创建饼图
        JFreeChart pieChart = ChartFactory.createPieChart(
                "Road Segments Lengths",  // 图表标题
                dataset,                  // 数据集
                true,                     // 是否显示图例
                true,                     // 是否显示工具提示
                false                     // 是否生成 URL 链接
        );
        // 获取饼图的绘图区域
        PiePlot plot = (PiePlot) pieChart.getPlot();
        // 设置饼图的背景颜色
        plot.setBackgroundPaint(Color.WHITE);
        // 设置响应的内容类型为图像
        response.setContentType("image/png");
        try (OutputStream outputStream = response.getOutputStream()) {
            // 将图像写入响应输出流
            ChartUtils.writeChartAsPNG(outputStream, pieChart, 800, 600);
        } catch (IOException e) {
            // 处理异常
            e.printStackTrace();
        }
    }
}
